home *** CD-ROM | disk | FTP | other *** search
- static char readtime_prog[] = "@(#)char *readtime(int f, char *tstr) - Zeit einlesen";
- static char readtime_ver[] = "@(#)v1.20/kr ; 21.07.91";
- /* readtime Einlesen eines Zeit-String
- **
- ** Autor Klaus Rath
- **
- ** Deklaration char *readtime(int format, char *timestring);
- **
- ** Compilation DOS: bcc -c readtime.c c:\usr\local\lib\libkrc_s.lib
- ** UNIX: cc -c readtime.c /u1/usr/lib/libkrc.a
- ** ( unter DOS kann die Funktion im small-Modell laufen )
- **
- ** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
- ** chem Format eingelesen werden soll.
- ** Z.Zt. erlaubte Formate (siehe datum.h) :
- ** hh:mm[:ss] -- Formate 1,2
- ** hh.mm[.ss] -- Formate 3,4
- ** hhmm[ss] -- Datenbankformate 5,6 (DDB/4)
- ** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
- ** des Ergebnisses erwartet.
- **
- ** Rückgabe (char *) auf timestring
- **
- ** Anmerkungen Die Funktion prüft nicht die Validität der eingegebenen
- ** Zeit - dies sollte die aufrufende Funktion selbst tun,
- ** bzw. den Test durch checktime() durchführen lassen.
- ** Die Funktion benutzt zum Einlesen eine Funktion
- ** int editgetch(int form), die einen Tastendruck entsprechend
- ** dem übergebenen Format form bewertet. Z.Zt. sind folgende
- ** Formate implementiert ( s. util.h ) :
- ** ALL (1) - Alle Character 0 - 255
- ** UPPER (2) - Buchstaben werden in GROSS konvertiert
- ** LOWER (3) - Buchstaben werden in klein konvertiert
- ** NUM (4) - Zahlen, '.', ',', '+', '-'
- ** DATUM (5) - Zahlen, '.', '/', '-'
- ** ZEIT (6) - Zahlen, '.', ':'
- ** readtime() stellt dem Aufrufer eine Maske des angeforder-
- ** ten Format zur Verfügung ( z.B. 00:00:00 ), wobei die
- ** Unterstriche durch Zahlen gefüllt werden müssen. Die
- ** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
- ** nicht editierbar und werden automatisch erzeugt. Eine
- ** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
- ** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
- ** immer, hinter der letzten Position genügt ein beliebige
- ** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
- **
- ** Änderungen 1.00 ; 09.06.91
- ** - Erste Version
- ** 1.10 ; 18.07.91
- ** - Fehler im Korrekturteil beseitigt.
- ** - Variable int trenner = ':'||'.' eingefügt.
- ** 1.20 ; 21.07.91
- ** - Berücksichtigung eines evtl. bereits eingegebenen
- ** ersten Zeichens (dazu Variable: int def_char).
- ** - Taste ESC (27) gibt jetzt einen NULL-Zeiger zurück
- ** ( tatsächlicher Abbruch !), während RETURN weiterhin
- ** den vorbelegten bzw. (teil-)ausgefüllten String liefert.
- */
-
- #include <stdio.h>
- #include <string.h>
- #ifdef __TURBOC__
- #define ANSI
- #define KR_SYS
- #include <stdlib.h>
- #include "datum.h"
- #include "util.h"
- #else
- #include "/u1/usr/include/datum.h"
- #include "/u1/usr/include/util.h"
- #endif
-
- #ifdef ANSI
- char *readtime(int format, char *tstring)
- #else
- char *readtime(format,tstring)
- int format;
- char *tstring;
- #endif
- {
- /* Variablendefinitionen :
- */
- int trennpos1 = 2, /* Positionen von Trennzeichen */
- trennpos2 = 5;
- int trenner; /* Trennzeichen */
- int pos = 0; /* Aktuelle Position */
- int maxpos = 11; /* Letztmögliche Position */
- int max = 0; /* Schalter, ob am Ende */
- int ch; /* Einzulesendes Zeichen */
- int def_char = '0'; /* Vorbelegungszeichen */
-
- /* Berücksichtigung eines bereits vorhandenen 1. Zeichens in tstring :
- */
- if ( tstring[0] == '\0' ) {
- tstring[0] = def_char;
- }
- else {
- pos = 1;
- }
-
- /* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
- */
- switch ( format ) {
- case TI_HM_D :
- trenner = 58;
- maxpos = 6;
- tstring[1] = def_char;
- tstring[trennpos1] = trenner;
- tstring[3] = def_char;
- tstring[4] = def_char;
- tstring[5] = '\0';
- trennpos2 = 99;
- printf("%c0:00",tstring[0]);
- printf("\b\b\b\b");
- break;
- case TI_HM_P :
- trenner = 46;
- maxpos = 6;
- tstring[1] = def_char;
- tstring[trennpos1] = trenner;
- tstring[3] = def_char;
- tstring[4] = def_char;
- tstring[5] = '\0';
- trennpos2 = 99;
- printf("%c0.00",tstring[0]);
- printf("\b\b\b\b");
- break;
- case TI_HMS_P :
- trenner = 46;
- maxpos = 9;
- tstring[1] = def_char;
- tstring[trennpos1] = trenner;
- tstring[3] = def_char;
- tstring[4] = def_char;
- tstring[trennpos2] = trenner;
- tstring[6] = def_char;
- tstring[7] = def_char;
- tstring[8] = '\0';
- printf("%c0.00.00",tstring[0]);
- printf("\b\b\b\b\b\b\b");
- break;
- case TI_HM_DB :
- maxpos = 5;
- tstring[1] = def_char;
- tstring[2] = def_char;
- tstring[3] = def_char;
- tstring[4] = '\0';
- trennpos1 =
- trennpos2 = 99;
- printf("%c000",tstring[0]);
- printf("\b\b\b");
- break;
- case TI_HMS_DB :
- maxpos = 7;
- tstring[1] = def_char;
- tstring[2] = def_char;
- tstring[3] = def_char;
- tstring[4] = def_char;
- tstring[5] = def_char;
- tstring[6] = '\0';
- trennpos1 =
- trennpos2 = 99;
- printf("%c00000",tstring[0]);
- printf("\b\b\b\b\b");
- break;
- case TI_HMS_D :
- default :
- trenner = 58;
- maxpos = 9;
- tstring[1] = def_char;
- tstring[trennpos1] = trenner;
- tstring[3] = def_char;
- tstring[4] = def_char;
- tstring[trennpos2] = trenner;
- tstring[6] = def_char;
- tstring[7] = def_char;
- tstring[8] = '\0';
- printf("%c0:00:00",tstring[0]);
- printf("\b\b\b\b\b\b\b");
- break;
- } /* ENDE: switch(format) */
-
- /* Evtl. noch ein BACKSPACE ausführen :
- */
- if ( !pos ) {
- printf("\b");
- }
-
- /* Tastendrucke abholen, bis maxpos :
- */
- while ( pos < maxpos + 1 ) {
-
- /* Falls fertig, String zurückgeben :
- */
- if ( pos == maxpos ) {
- tstring[pos] = '\0';
- return(tstring);
- }
- /* An eventuellen Trennerpositionen den passenden Trenner einfügen
- ** und den nächsten Schleifendurchlauf abwarten :
- */
- if ( pos == trennpos1 || pos == trennpos2 ) {
- printf("%c",trenner);
- pos++;
- continue;
- }
- /* An der vorletzten Position sind alle Tasten erlaubt, denn nur
- ** BACKSPACE bleibt in der Funktion :
- */
- if ( pos == maxpos - 1 ) {
- max = 1;
- ch = editgetch(ALL);
- } /* pos < maxpos -1 */
- else
- ch = editgetch(ZEIT);
-
- /* Auswertung der gedrückten Taste :
- */
- switch ( ch ) {
-
- /* Nicht Zulässiges ignorieren :
- */
- case NULL:
- case -1 :
- break;
-
- /* Abbruchmöglichkeiten :
- */
- case 27 :
- tstring[0] = '\0';
- return(tstring);
- case 10 :
- case 13 :
- return(tstring);
-
- /* Korrekturmöglichkeit :
- */
- case 8 :
- if ( pos == trennpos1 || pos == trennpos2 ) {
- tstring[pos] = trenner;
- }
- else {
- tstring[pos] = 48;
- tstring[maxpos-1] = '\0';
- }
-
- /* Schalter für MAX-Position zurücksetzen :
- */
- if ( max )
- max = 0;
-
- /* Trenner überspringen und Maskendefault anzeigen :
- */
- if ( pos == trennpos1 + 1 || pos == trennpos2 + 1 ) {
- printf("\b\b0\b");
- pos -= 2;
- break;
- }
-
- /* Ansonsten zurück und Maskendefault anzeigen :
- */
- if ( pos ) {
- printf("\b0\b");
- pos--;
- }
- tstring[pos] = def_char;
-
- break;
- default :
- /* Falls wir fertig sind, String abschließen und
- ** zurückgeben :
- */
- if ( max ) {
- tstring[pos] = '\0';
- return(tstring);
- }
-
- /* Ansonsten ist es eine Zahl, die angezeigt und ein-
- ** getragen wird :
- */
- printf("%c",ch);
- tstring[pos] = ch;
- pos++;
-
- } /* ENDE: switch(ch) */
- } /* ENDE: while(pos) */
-
- return(tstring);
-
- } /* ENDE: readtime() */
-
-